package cn.com.bluemoon.daps.domp.api;

import cn.com.bluemoon.daps.common.constant.ServiceNameConstants;
import cn.com.bluemoon.daps.common.domain.FeignApiRespBean;
import cn.com.bluemoon.daps.common.domain.UserInfoHolder;
import cn.com.bluemoon.daps.domp.api.factory.RemoteUserServiceFallbackFactory;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;

@FeignClient(value = ServiceNameConstants.DapsApiDomp.USER_SERVICE, fallbackFactory = RemoteUserServiceFallbackFactory.class)
@RequestMapping("/dap-user")
@Api(tags = "FeignClient服务-蓝数通bd-user-service")
public interface UserService {

    /**
     * 判断是否登陆,是则返回用户账号
     */
    @RequestMapping("/isLoginUser")
    public String isLoginUserWrapper(@RequestParam("token") String token);

    /**
     * 发现token为空（多个空）出现拿到用户信息情况进行修复
     */
    default String isLoginUser(String token){
        if (StringUtils.isBlank(StringUtils.trim(token))){
            return null;
        }
        return isLoginUserWrapper(token);
    }

    /**
     * 判断是否登陆SFA,是则返回用户账号
     */
    @RequestMapping("/isLoginUserSFA")
    public String isLoginUserSFA(@RequestParam("token") String token);

    /**
     * 通过天使获取帐号
     */
    @RequestMapping("/getAccountByAngel")
    public String getAccountByAngel(@RequestParam("token") String token);

    /**
     * 通过SFA获取帐号
     */
    @RequestMapping("/getAccountBySFA")
    public String getAccountBySFA(@RequestParam("token") String token);

    /**
     * 通过userId获得用户信息
     */
    @RequestMapping("/getUserById")
    public List<Map<String, Object>> getUserById(@RequestParam("userId") String userId);

    /**
     * 通过userId获得用户信息
     */
    @RequestMapping("/getUserInfoById")
    public List<Map<String, Object>> getUserInfoById(@RequestParam("userId") String userId);

    /**
     * 用户信息
     */
    default UserInfoHolder.UserInfo getUserInfoByUserId(String userId) {
        List<Map<String, Object>> userInfoById = getUserInfoById(userId);
        if (userInfoById != null) {
            Map<String, Object> map = userInfoById.stream().findFirst().orElse(Collections.emptyMap());
            UserInfoHolder.UserInfo userInfo = new UserInfoHolder.UserInfo();
            userInfo.setAccount(map.getOrDefault("ID", "").toString());
            userInfo.setMobile(map.getOrDefault("MOBILE", "").toString());
            userInfo.setUserName(map.getOrDefault("USER_NAME", "").toString());
            userInfo.setEmail(map.getOrDefault("EMAIL", "").toString());
            return userInfo;
        }
        return null;
    }

    /**
     * 获取用户邮箱
     */
    default Optional<String> getUserEmailByUserId(String userId) {
        List<Map<String, Object>> userInfoById = getUserInfoById(userId);
        if (userInfoById != null) {
            Map<String, Object> map = userInfoById.stream().findFirst().orElse(Collections.emptyMap());
            return Optional.ofNullable(map.getOrDefault("EMAIL", "").toString());
        }
        return Optional.empty();
    }

    /**
     * 根据userId获取token
     */
    @RequestMapping("/getToken")
    public String getToken(@RequestParam("userId") String userId);

    /**
     * 从天使中登陆
     *
     * @param username 用户名
     * @param password 加密后密码
     */
    @RequestMapping("/loginAngel")
    public String loginAngel(@RequestParam("username") String username, @RequestParam("password") String password);

    /**
     * 从DOMP中登陆后，通过UserService把token和username放入redis
     *
     * @param username 用户名
     * @param token    用户标识token
     */
    @RequestMapping("/loginDOMP")
    public String loginDOMP(@RequestParam("username") String username, @RequestParam("token") String token);

    /**
     * 通过token检查用户是否为BMBI管理员，是管理员则返回管理员ID
     *
     * @param token 用户标识token
     */
    @RequestMapping("/isAdminBMBI")
    public String isAdminBMBI(@RequestParam("token") String token);


    /**
     * 用户登陆
     *
     * @param userName 用户名
     * @param passWord 密码
     * @throws Exception 注意：页面传过来的密码为AES加密后的密码，发送给天使的密码为DES加密后的密码，
     *                   保存在domp数据库中的的密码为md5加密后的密码
     *                   domp默认密码为tR4362do
     */
    @RequestMapping(value = "/login")
    public String login(@RequestParam("userName") String userName, @RequestParam("passWord") String passWord);

    /**
     * 该登录生产可以，但测试不行，由于测试环境用的是蓝数通的账号和密码，而我们生产用的是门户的账号和密码
     * 若测试环境和生产都可以登录，则走{@link IDompService#dompLogin(Integer, String)} 蓝数通那边统一进行接口适配
     *
     * @param user 门户账号（生产蓝数通账号）
     * @param pwd  门户密码（生产蓝数通密码）
     */
    @SuppressWarnings("unchecked")
    @Deprecated
    default FeignApiRespBean<Map<String, Object>> bmLogin(String user, String pwd) {
        String respData = login(user, pwd);
        @SuppressWarnings("rawtypes") FeignApiRespBean feignApiRespBean = JSONObject.parseObject(respData, FeignApiRespBean.class);
        return feignApiRespBean;
    }

    /**
     * 用户加密登陆
     *
     * @param userName 用户名
     * @param passWord 密码（经过加密的密码）
     */
    @RequestMapping(value = "/encryptLogin")
    public String encryptLogin(@RequestParam("userName") String userName, @RequestParam("passWord") String passWord);
}
